草庐IT

C++ 运算符 [] 魔法

全部标签

c++ - 在 Boost.Log 中正确重载运算符 <<

在Boost.Logdocumentation,据说NoteThelibraryusesbasic_formatting_ostreamstreamtypeforrecordformatting,sowhencustomizingattributevalueformattingrulestheoperatormustusebasic_formatting_ostreaminsteadofstd::ostream.但是,在整个文档中,我所看到的只是重载operator在std::ostream而不是basic_formatting_ostream在示例代码中。例如,查看自定义类型的重载s

c++ - 在没有隐式转换的情况下在编译时检测运算符

我正在使用C++03methodtodetectthepresenceofafunctionatcompiletime.我必须使用此方法而不是void_t方法,即使我使用的是C++14,因为我必须支持GCC4.9,并且在使用void_t方法时出错(奇怪的是只有Ubuntu14的GCC4.9有这个问题,而不是Fedora的,但它已在GCC5+AFAICT中全面修复)。具体来说,我正在检查operator是否存在这样我就可以拥有一个pretty-print功能,可以接受任何类型。当函数被调用时,如果类型支持它,您会得到常规的ostream输出,并且当运算符未定义时,您会收到一条关于没有实现

c++ - noexcept 运算符和 enable_if_t : do they work together?

考虑以下类:structS{templatestd::enable_if_t::value>f()noexcept{}templatestd::enable_if_t::value>g()noexcept{}};正如预期的那样,编译:s.f();这个不是:s.g();令我困惑的是,下面的main是用GCC(6.2)编译的,而不是用clang(3.9)编译的:intmain(){static_assert(noexcept(&S::f),"!");static_assert(noexcept(&S::g),"!");}我会说第二个断言失败是因为特化无效。两个编译器不同意这一点。哪个是正确

具有不同参数的 C++ 运算符重载模板

我正在探索C++,我想使用模板创建一个迷你数学矩阵库。在这里,我想重载运算符*。如果我这样描述一个矩阵:M(y,x),M是矩阵名称,y和x高度和宽度,矩阵乘法应该是这样的:M(a,b)*N(b,c)=R(a,c)目前我有这段代码:templateclassMatrix{public:Matrix(){}~Matrix(){}Matrix&operator*(constMatrix&right){//code...}private:std::array,y>m_values;};所以我希望能够像这样将两个不同的矩阵相乘:Matrixm;Matrixn;//fillthematrixwit

c++ - 为什么我必须使用寻址运算符来获取指向成员函数的指针?

structA{voidf(){}};voidf(){}intmain(){autop1=&f;//okautop2=f;//okautop3=&A::f;//ok////error:calltonon-staticmemberfunction//withoutanobjectargument//autop4=A::f;//Whynotok?}为什么我必须使用寻址运算符来获取指向成员函数的指针? 最佳答案 autop1=&f;//okautop2=f;//ok第一个或多或少是正确的。但是因为非成员函数有implicitconvers

c++ - 指针上的运算符<(小于)是否一致?

注意:这个问题不是关于总顺序的。可以使用std::less获得相同类型指针的总顺序。.Accordingtothis,将两个指针与operator进行比较例如,如果它们指向不同的分配,则不允许。在什么意义上不允许?它是实现定义的、未指定的还是未定义的行为?我想我在某处读到它未指定。不需要实现来记录行为是什么,但必须有一些行为。所以这意味着,比较任意两个指针仍然是合法的,但不一定会产生总顺序。这是否意味着,当比较相同的两个指针两次时,我们仍然必须获得一致的结果?一般情况是:在应用程序中两次调用相同的未指定行为是否总是产生相同的结果?inti1,i2;int*a=&i1;int*b=&i2

【C++】类与对象(三)—运算符重载|const成员函数|取地址及const取地址操作符重载

前言运算符重载,自增自减运算符重载,const成员函数,取地址及const取地址操作符重载文章目录一、运算符重载自增和自减运算符重载二、const成员函数三、取地址及const取地址操作符重载(了解即可)一、运算符重载运算符重载允许重新定义类对象的运算符行为。通过运算符重载,你可以使自定义类型的对象与内置类型一样,使用各种运算符进行操作,从而提高代码的可读性和灵活性。语法://函数名:关键字operator后面接需要重载的运算符符号。//函数原型:返回值类型operator操作符(参数列表)ReturnTypeoperator+(参数){//重载的+运算符的实现//返回类型可以是任何合适的类型

c++ - 我可以在没有流对象的情况下调用流运算符重载吗?

假设我想throw带有包含有关某个对象的信息的字符串,但对象实现仅对流运算符()进行重载,而不是强制转换为字符串。我想做这样的事情:throwstd::runtime_error("Error,encounteredinvalidvalue"+x);哪里x是具有()重载的类型的实例。但是,上面的方法不起作用,因为+未重载为与constchar*兼容的类型.如果x是一个字符串(或可转换为一个字符串)它会起作用,但我必须这样做:std::stringstreams;s如何在不添加任何重载或自定义函数的情况下获得与第一个示例一样简洁的内容。标准库是否提供了一些有助于解决此问题的功能?

c++ - 是否可以对数组(一大块内存)使用按位运算

有如下两个数组inta[100]={1,1,...}intb[100]={2,5,...}有什么办法可以这样操作吗c=a|bc的结果是{3,5,...}我想像memcpy一样直接操作内存我不想使用循环 最佳答案 按位运算的工作原理是将运算的元素移动到寄存器中,然后对寄存器进行运算。这意味着您的操作的寄存器大小受到硬件相关的限制,但最多为64位(或在某些新硬件情况下为128位)。这意味着即使有一些技巧,您也可以同时进行2个按位运算。如果您关心速度,我建议您使用parallel来实现您的结果。我还必须提到,您的示例在堆栈上创建了数组,这

c++ - 同级友元运算符似乎不参与重载决议

在编写使类能够根据模板参数为operator+提供重载的CRTP模板时,我发现类内友元运算符似乎不参与重载决议,如果没有的话arguments是它在其中定义的类的类型。归结:enumclassFooValueT{zero,one,two};classFoo{FooValueTval_;public:Foo(FooValueTx):val_(x){};Foo&operator+=(Fooother){val_=(FooValueT)((int)val_+(int)other.val_);return*this;}//overloadforFoo+Foo,FooValueT+FooandF